#!/usr/bin/env node

const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');
const process = require('process');

try {
    require('dotenv').config();
} catch (error) {
    console.warn('未找到.env文件，使用默认配置');
}

const config = {
    sourceBaseDir: process.env.OFFLINE_MAPS_DIR || path.join(__dirname, '../../offline-maps'),
    outputDir: process.env.MBTILES_PATH || path.join(__dirname, '../../mbtiles'),
    tileTypes: [
        { dir: 'image', name: 'image' },
        { dir: 'imageLabel', name: 'imageLabel' },
        { dir: 'terrain', name: 'terrain' },
        { dir: 'terrainLabel', name: 'terrainLabel' },
        { dir: 'vector', name: 'vector' },
        { dir: 'vectorLabel', name: 'vectorLabel' }
    ]
};

function checkDependencies() {
    console.log('===== 检查依赖 =====');
    const requiredTools = ['node-mbutil'];
    
    for (const tool of requiredTools) {
        try {
            // 检查node-mbutil是否存在于tools目录
            const mbutilPath = path.join(__dirname, '../../tools/node-mbutil/mbutil.js');
            if (fs.existsSync(mbutilPath)) {
                console.log(`✓ ${tool} 已存在`);
            } else {
                throw new Error(`${tool} not found`);
            }
        } catch (error) {
            console.error(`✗ ${tool} 未找到，请确保已克隆子模块`);
            return false;
        }
    }
    
    return true;
}

function ensureDir(dirPath) {
    if (!fs.existsSync(dirPath)) {
        console.log(`创建目录: ${dirPath}`);
        fs.mkdirSync(dirPath, { recursive: true });
    }
}

function generateMetadata(tileDir, tileType) {
    const metadataPath = path.join(tileDir, 'metadata.json');
    
    // 定义基础元数据
    const metadata = {
        name: `${tileType} Tiles`,
        description: `${tileType} 瓦片集`,
        version: '1.0.0',
        type: 'baselayer',
        format: 'png',//目前都是png格式
        scheme: 'xyz',
        minzoom: 0,
        maxzoom: 18,
        bounds: "-180,-90,180,90"
    };
    
    // 根据瓦片类型调整格式
    //if (tileType.includes('image') || tileType.includes('terrain')) {
    //    metadata.format = 'png';
    //}
    
    console.log(`生成metadata.json: ${metadataPath}`);
    fs.writeFileSync(metadataPath, JSON.stringify(metadata, null, 2));
    return metadataPath;
}

function convertTilesToMbtiles(tileDir, outputFile, tileType, overlayCoords = false) {
    const mbutilPath = path.join(__dirname, '../../tools/node-mbutil/mbutil.js');
    
    console.log(`\n开始转换: ${path.basename(tileDir)} -> ${path.basename(outputFile)}`);
    if (overlayCoords) {
        console.log(`启用坐标叠加功能`);
    }
    
    try {
        // 生成metadata.json文件
        generateMetadata(tileDir, tileType.name);
        
        // 使用node-mbutil将瓦片目录转换为mbtiles文件
        let command = `node ${mbutilPath} --from ${tileDir} --to ${outputFile} --scheme xyz --silent`;
        if (overlayCoords) {
            command += ' --overlayCoords true';
        }
        execSync(command, { stdio: 'inherit' });
        
        console.log(`✓ 转换完成`);
        return true;
    } catch (error) {
        console.error(`✗ 转换失败: ${error.message}`);
        return false;
    } finally {
        // 清理生成的metadata.json文件
        const metadataPath = path.join(tileDir, 'metadata.json');
        if (fs.existsSync(metadataPath)) {
            fs.unlinkSync(metadataPath);
        }
    }
}

function isTileDirValid(tileDir) {
    if (!fs.existsSync(tileDir)) {
        console.log(`瓦片目录不存在: ${tileDir}`);
        return false;
    }
    
    const files = fs.readdirSync(tileDir);
    if (files.length === 0) {
        console.log(`瓦片目录为空: ${tileDir}`);
        return false;
    }
    
    return true;
}

function convertAllTiles() {
    console.log('===== 瓦片转MBTiles工具 =====');
    
    if (!checkDependencies()) {
        process.exit(1);
    }
    
    ensureDir(config.outputDir);
    
    let successCount = 0;
    
    for (const tileType of config.tileTypes) {
        const tileDir = path.join(config.sourceBaseDir, tileType.dir);
        
        if (!isTileDirValid(tileDir)) {
            continue;
        }
        
        const outputFile = path.join(config.outputDir, `${tileType.name}.mbtiles`);
        
        if (fs.existsSync(outputFile)) {
            console.log(`删除已存在的文件: ${outputFile}`);
            fs.unlinkSync(outputFile);
        }
        
        // 可以在这里设置是否启用坐标叠加，默认为false
        const enableOverlay = false;
        if (convertTilesToMbtiles(tileDir, outputFile, tileType, enableOverlay)) {
            successCount++;
        }
    }
    
    console.log('\n===== 转换完成 =====');
    console.log(`成功转换: ${successCount} 个瓦片集`);
    
    if (successCount > 0) {
        console.log(`\n提示: 要启用MBTiles模式，请在.env文件中设置:`);
        console.log(`USE_MBTILES=true`);
        console.log(`MBTILES_PATH=${config.outputDir}`);
    }
}

convertAllTiles();